﻿#include "db_api_.h"

#define LOCK	OAL_mutex_lock(&hDB->mutex)
#define UNLOCK	OAL_mutex_unlock(&hDB->mutex)

int db_init(db_cb cb, get_sd_status cb_get_sd_status)
{
	int ret = 0;

	if(hDB)
	{
		_db_free();
	}

	ret = _db_init(cb, cb_get_sd_status);
	if(ret)
	{
		_db_free();
	}
	return ret;
}

void db_free()
{
	_db_free();
}

int db_reset(void)
{
	int ret = 0;
	if(hDB == 0) return -1;
	LOCK;
	ret = _db_reset();
	UNLOCK;
	return ret;
}

int db_get_state(void)	//获取数据库状态；-1=数据库未初始化；0=unmount；1=构建中；2=就绪，应用可以访问。-2=数据库出错
{
	int ret = 0;
	if(hDB == 0)	return -1;
	LOCK;
	ret = _db_get_state();					
	UNLOCK;
	return ret;
}

int db_mount(void)
{
	int ret = 0;
	if(hDB == 0) return -1;
	LOCK;
	ret = _db_mount();
	UNLOCK;
	return ret;
}

int db_unmount(void)
{
	int ret = 0;
	if(hDB == 0) return -1;
	LOCK;
	ret = _db_unmount();
	UNLOCK;
	return ret;
}

int db_set_like(char * path, int like)
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(path == 0)	return -1;
	if(like < -32 || like == 0 || like > 32) return -1;
	if(!is_archive(path))	return -1;
	LOCK;
	ret = _db_set_like(path, like);
	UNLOCK;
	return ret;
}

int db_delete_file(char * path)
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(path == 0)	return -1;
	if(!is_archive(path))	return -1;
	LOCK;
	ret = _db_delete_file(path);
	UNLOCK;
	return ret;
}

int db_add_wave(char * path)
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(path == 0)	return -1;
	if(!is_wave(path))	return -1;
	LOCK;
	ret = _db_add_wave(path);
	UNLOCK;
	return ret;
}

int db_add_tag(
	char * path,			// 文件名；类型是 MEDIA_HI_TEXT / MEDIA_HI_AUDIO / MEDIA_HI_WAVE
	unsigned int No,		// 标签序号
	unsigned int tag		// 标签值
	)						// 返回-1表示出错；0=OK
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(path == 0)	return -1;
	if(!is_archive(path))	return -1;
	if((file_type(path) & (MEDIA_HI_TEXT|MEDIA_HI_AUDIO|MEDIA_HI_WAVE)) == 0)	return -1;
	if(No >= MAXTAG)	return -1;
	LOCK;
	ret = _db_add_tag(path, No, tag);
	UNLOCK;
	return ret;
}

int db_read_type(
	unsigned int type,		// MEDIA_HI_TEXT / MEDIA_HI_IMAGE / MEDIA_HI_AUDIO / MEDIA_HI_VIDEO / MEDIA_HI_WAVE
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；参数全0（type除外）返回该type的总个数
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if((type&(MEDIA_HI_TEXT|MEDIA_HI_IMAGE|MEDIA_HI_AUDIO|MEDIA_HI_VIDEO|MEDIA_HI_WAVE)) == 0)	return -1;
	if(records != 0 && fname != 0)	return-1;
	LOCK;
	ret = _db_read_type(type,offset,records,fname,cnt);					
	UNLOCK;
	return ret;
}

int db_read_like(
	int like,				// 喜欢号，1-32之间
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；参数全0（like除外）返回该like的总个数
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(like <= 0 || like > 32) return -1;
	if(records != 0 && fname != 0)	return-1;
	LOCK;
	ret = _db_read_like(like,offset,records,fname,cnt);					
	UNLOCK;
	return ret;
}

int db_read_folder(
	char * dir,				// 目录名
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；参数全0（dir除外）返回该dir的总个数；如果dir也填0，则返回所有目录的个数
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(records != 0 && fname != 0)	return-1;
	LOCK;
	ret = _db_read_folder(dir,offset,records,fname,cnt);					
	UNLOCK;
	return ret;
}

int db_read_pl(
	char * dir,				// 目录名
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；参数全0（dir除外）返回该dir的总个数；如果dir也填0，则返回所有目录的个数
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(records != 0 && fname != 0)	return-1;
	LOCK;
	ret = _db_read_pl(dir,offset,records,fname,cnt);					
	UNLOCK;
	return ret;
}

int db_read_albums(			// 读取所有专辑名称
	unsigned int offset,	// 偏移值
	RECITEMUTF8 * albums,	// 输出的utf8专辑名指针，0=不输出专辑名, 只查询专辑个数
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(cnt < 0)		return -1;
	LOCK;
	ret = _db_read_albums(offset,albums,cnt);					
	UNLOCK;
	return ret;
}

int db_read_audio_by_album(
	char * album,			// 输入参数，非空的专辑名，utf8格式
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；如果records和fname均为0，则返回该专辑的所有歌曲的个数
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(album == 0)	return -1;
	LOCK;
	ret = _db_read_audio_by_album(album,offset,records,fname,cnt);					
	UNLOCK;
	return ret;
}

int db_read_album(
	char * album,			// 专辑名，utf8格式
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	RECITEMUTF8 * albums,	// 输出的utf8专辑名指针，0=不输出专辑名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；参数全0（album除外）返回该album的歌曲的总个数；如果album也填0，则返回所有album的个数
							// 特别说明：album为空，查询所有专辑名称信息，此时不理会records和fname指针。当指针albums非空，取回专辑名称列表
							// 特别说明：album非空，查询指定专辑的音乐文件信息，此时不理会albums指针。当指针records和fname其中一个不为空，取回该专辑音乐相应的字段信息
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(album == 0)
	{
		if(records || fname)	return -1;
	}
	else
	{
		if(albums)	return -1;
		if(records && fname)	return-1;
	}
	LOCK;
	ret = _db_read_album(album,offset,records,fname,albums,cnt);					
	UNLOCK;
	return ret;
}

int db_read_artists(		// 读取所有专辑名称
	unsigned int offset,	// 偏移值
	RECITEMUTF8 * artists,	// 输出的utf8专辑名指针，0=不输出专辑名, 只查询专辑个数
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；
{
	int ret = 0;
	if(hDB == 0)	return -1;
	LOCK;
	ret = _db_read_artists(offset,artists,cnt);					
	UNLOCK;
	return ret;
}

int db_read_audio_by_artist(
	char * artist,			// 输入参数，非空的专辑名，utf8格式
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；如果records和fname均为0，则返回该专辑的所有歌曲的个数
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(artist == 0)	return -1;
	LOCK;
	ret = _db_read_audio_by_artist(artist,offset,records,fname,cnt);					
	UNLOCK;
	return ret;
}

int db_read_artist(
	char * artist,			// 艺术家名，utf8格式
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	RECITEMUTF8 * artists,	// 输出的utf8专辑名指针，0=不输出专辑名
	unsigned int cnt		// 请求的记录个数
	)						// 返回读取到的记录个数，-1表示出错；参数全0（artist除外）返回该artist的歌曲的总个数；如果artist也填0，则返回所有artist的个数
							// 特别说明：artist为空，查询所有歌手名称信息，此时不理会records和fname指针。当指针albums非空，取回歌手名称列表
							// 特别说明：artist非空，查询指定歌手的音乐文件信息，此时不理会artists指针。当指针records和fname其中一个不为空，取回该专辑音乐相应的字段信息
{
	int ret = 0;
	if(hDB == 0)	return -1;
	if(artist == 0)
	{
		if(records || fname)	return -1;
	}
	else
	{
		if(artists)	return -1;
		if(records != 0 && fname != 0)	return-1;
	}
	LOCK;
	ret = _db_read_artist(artist,offset,records,fname,artists,cnt);					
	UNLOCK;
	return ret;
}
